package Util;

import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * Created by sunwei on 2017/9/25
 * Time:15:03
 */
/*
连接数据库的6大操作：
1.加载驱动Class.forName(driver)
2.获取连接：connection = DriverManager.getconnection(url:数据库地址，userName:数据库名字，password:数据库密码)
3.创建处理对象 PrepareStatement pstmt; pstmt = connection.prepareStatement()
4.执行sql语句：pstmt.executeQuery(sql) 查询语句 pstmt.executeUpdate(sql) 增、删、改
5.获取结果集：resultSet =  pstmt.executeUpdate(sql)  获取数据表里面的字段（执行查询操作时）：ResultSetMetaData metaData = resultSet.getMetaData();
6.关闭数据库流 ： releaseConn
 */
public class JdbcUtil {
    private static String userName;//表示定义的数据库的用户名
    private static String password;//表示定义的数据库的密码
    private static String driver; //定义的数据库的驱动信息
    private static String URL; //定义访问数据的地址
    private Connection connection;//定义数据库的链接
    private PreparedStatement pstmt;//定义sql语句的执行对象
    private ResultSet resultSet;//定义查询返回结果的结果集
    static {
        loadConfig();
    }
    /*
    加载数据库配置信息，并给相关的属性赋值
     */
    public static void loadConfig(){
        try {
            InputStream inStream = JdbcUtil.class.getResourceAsStream("/jdbc.properties");
            Properties prop = new Properties();
            prop.load(inStream);
            userName = prop.getProperty("jdbc.username");
            password = prop.getProperty("jdbc.password");
            driver = prop.getProperty("jdbc.driver");
            URL= prop.getProperty("jdbc.url");
        } catch (Exception e) {
            throw new RuntimeException("读取数据库配置文件异常",e);
        }
    }
    /*
    私有的构造函数
     */
    public JdbcUtil() {
    }

    /*
    加载驱动和获取数据库连接，进行封装
    *@return 数据库连接
     */
    public  Connection getConnection(){
        try {
            Class.forName(driver);
            connection = DriverManager.getConnection(URL,userName,password);//获取连接
            connection.setAutoCommit(false);//设置为手动提交事务
        } catch (Exception e) {
            throw new RuntimeException("获取连接失败"+e);
        }
        return connection;
    }
    /**
    执行增、删、改 操作
    * @param sql
    * @param setParams
    * @return 执行结果
    * @throw SQLException
     */
    public boolean updateByPreparedStatement(String sql,SetParams setParams)
    throws SQLException{
        boolean flag = false;
        int result = -1;//表示当用户执行增、删、和改的时候影响数据库的行数
        pstmt = connection.prepareStatement(sql);
        if (setParams!=null) {
              setParams.doSet(pstmt);
        }
        result = pstmt.executeUpdate();
        flag = result>0 ? true:false;
        connection.commit(); //如果所有sql语句成功，则提交事务
        return flag;
    }
    /*
    * 执行查询操作
     */
    public void findResult(String sql,SetParams setParams,ResultSetHandler resultSetHandler)throws SQLException{
        //执行sql语句
        pstmt = connection.prepareStatement(sql);
        //设置参数
        if(setParams!=null){
            setParams.doSet(pstmt);
        }
        //执行数据库查询语句
        resultSet = pstmt.executeQuery();
        //对获取的结果集进行处理
        if(resultSetHandler!=null){
            resultSetHandler.doHandler(resultSet);
        }
    }
    /*
    释放资源
     */
    public void releaseConn(){
        if (resultSet!=null) {
              try {
                  resultSet.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
        }
        if (pstmt!=null) {
              try {
                  pstmt.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
        }
        if (connection!=null) {
              try {
                  connection.close();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
        }

    }
}
